﻿# coding: utf-8
import glob
import xlrd
import xlwt
import datetime
#得到需要合并的文件路径
location = "D:/one/"
#新生成文件的名称 以目前时间
date = str(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
print(date)
#文件名称列表
fileList = []
# 读取目标文件夹所有xls格式文件名称，存入fileList
for fileName in glob.glob(location + "*.xls"):
    fileList.append(fileName) 
print("有%d个xls文件"%len(fileList)+"\n")
print(fileList)
fileNum = len(fileList)
#得到一个和文件数量相等的空列表
matrix = [None] * fileNum

#得到第一行的字段名称
head = []
workBook = xlrd.open_workbook(fileList[0])
try:
    sheet = workBook.sheet_by_index(0)
except Exception as e:
    print(e)	
nCols = sheet.ncols
head = ["0"]*nCols
for k in range(nCols):
    head [k] = sheet.cell(0,k).value
print("本次合并文件共%d列"%(len(head))+"\n")
print(head)


#读文件、遍历每一个文件
for i in range(fileNum):
    fileName = fileList[i]#得到当前的文件路径
    workBook = xlrd.open_workbook(fileName)#打开文件
    try:
        sheet = workBook.sheet_by_index(0)#得到工作表sheet1
    except Exception as e:
        print(e)
    nRows = sheet.nrows#获取到当前工作表sheet1有多少行
    matrix[i] = [0]*(nRows - 1)#在matrix对应的位置(当前的文件)生成一个行数相同的列表

    nCols = sheet.ncols#得到当前工作文件的列数
    for m in range(nRows - 1):#遍历当前工作文件的每一行
        matrix[i][m] = ["0"]* nCols#将matrix生成个二维列表，对应当前文件行列的大小

    for j in range(1,nRows):#遍历当前文件的第二行到最后一行
        for k in range(nCols):#在每一行中遍历每一列
            matrix[i][j-1][k] = sheet.cell(j,k).value#i代表第几个文件的列表，j、k对应文件的位置。

fileName = xlwt.Workbook()#写入一个新的文件
sheet = fileName.add_sheet("yanwen")#给这个文件的sheet1重命名
for i in range(len(head)):#遍历当前的表头数量
    sheet.write(0,i,head[i])# 把准备的表头写入新的文件sheet1表中
rowIndex = 1#将行数设定为1

for fileIndex in range(fileNum):#执行文件数量次数的循环
    print("正在合并第%d个文件"%(fileIndex+1))
    for j in range(len(matrix[fileIndex])):#遍历文件对应的matrix的列表位置，遍历这个文件行数次的循环
        for colIndex in range (len(matrix[fileIndex][j])):#拿到对应位置的文件，循环文件每一行长度（列）的次数
            sheet.write(rowIndex,colIndex,matrix[fileIndex][j][colIndex])#写入内容，每一行中每一列循环遍历的写入
        rowIndex += 1
print("\n"+"共%d个文件合并完成"%fileNum)
fileName.save(location + date + ".xls")

